/*
 * @Author: LiZhiJian
 * @Description: 使用TIM3为舵机产生PWM信号 PA6->右前脚,PA7->右后脚,PB0->左前脚,PB1->左后脚
 * @Date: 2025-10-28 15:50:42
 * @LastEditTime: 2025-10-28 16:09:40
 * @Email: LiZhiJian8552@163.com
 */
#include "pwm.h"
/**
  * 函    数：PWM初始化
  * 参    数：无
  * 返 回 值：无
  */
void PWM_Init(void){
    RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3,ENABLE);    
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,ENABLE);

    // GPIO初始化
    GPIO_InitTypeDef GPIO_InitStruct={0};
    GPIO_InitStruct.GPIO_Mode=GPIO_Mode_AF_PP;
    GPIO_InitStruct.GPIO_Pin=GPIO_Pin_6|GPIO_Pin_7;
    GPIO_InitStruct.GPIO_Speed=GPIO_Speed_50MHz;
    GPIO_Init(GPIOA,&GPIO_InitStruct);
    GPIO_InitStruct.GPIO_Pin=GPIO_Pin_0|GPIO_Pin_1;
    GPIO_Init(GPIOB,&GPIO_InitStruct);

    // 配置是时钟源
    //选择TIM3为内部时钟
    TIM_InternalClockConfig(TIM3);


    // 配置时基单元
    TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStruct={0};
    //时钟分频，选择不分频，此参数用于配置滤波器时钟
    TIM_TimeBaseInitStruct.TIM_ClockDivision=TIM_CKD_DIV1;
    // 产生20ms周期
    TIM_TimeBaseInitStruct.TIM_Period=20000-1;
    TIM_TimeBaseInitStruct.TIM_Prescaler=72-1;
    TIM_TimeBaseInitStruct.TIM_RepetitionCounter=0;
    TIM_TimeBaseInit(TIM3,&TIM_TimeBaseInitStruct);

    // 输出比较初始化
    TIM_OCInitTypeDef TIM_OCInitStruct={0};
    // 进行默认初始化
    TIM_OCStructInit(&TIM_OCInitStruct);

    TIM_OCInitStruct.TIM_OCMode=TIM_OCMode_PWM1;
    // 输出比较极性，选择为高
    TIM_OCInitStruct.TIM_OCPolarity=TIM_OCPolarity_High;
    TIM_OCInitStruct.TIM_OutputState=TIM_OutputState_Enable;
    // 初始化CCR的值，默认输出低
    TIM_OCInitStruct.TIM_Pulse=0;

    // 使用结构体初始化比较通道
    TIM_OC2Init(TIM3,&TIM_OCInitStruct);
    TIM_OC3Init(TIM3,&TIM_OCInitStruct);
    TIM_OC1Init(TIM3,&TIM_OCInitStruct);
    TIM_OC4Init(TIM3,&TIM_OCInitStruct);

    // TIM使能
    TIM_Cmd(TIM3,ENABLE);
}


/**
  * 函    数：PWM设置CCR
  * 参    数：Compare 要写入的CCR的值，范围：0~100
  * 返 回 值：无
  * 注意事项：CCR和ARR共同决定占空比，此函数仅设置CCR的值，并不直接是占空比
  *           占空比Duty = CCR / (ARR + 1)
  */
void PWM_SetCompare1(uint16_t Compare){
    // 设置通道1的CCR的值
    TIM_SetCompare1(TIM3,Compare);
}
void PWM_SetCompare2(uint16_t Compare){
    TIM_SetCompare2(TIM3,Compare);
}
void PWM_SetCompare3(uint16_t Compare){
    TIM_SetCompare3(TIM3,Compare);
}
void PWM_SetCompare4(uint16_t Compare){
    TIM_SetCompare4(TIM3,Compare);
}

